package com.czm.art_light.service.impl;

import com.czm.art_light.constant.ArtErrorCodeEnum;
import com.czm.art_light.entity.ArtStatistics;
import com.czm.art_light.exception.BusinessException;
import com.czm.art_light.mapper.ArtStatisticsMapper;
import com.czm.art_light.service.ArtStatisticsService;
import com.czm.art_light.util.StatisticsUpdateFunction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;

/**
 * 作品统计信息 服务类
 */
@Service
public class ArtStatisticsServiceImpl implements ArtStatisticsService {
    @Autowired
    private ArtStatisticsMapper artStatisticsMapper;

//    @Autowired
//    private AmqpMsgProducer amqpMsgProducer;

    /**
     * 统一处理统计字段更新逻辑
     *
     * @param workId      作品ID
     * @param updateFunc  更新方法（Mapper方法引用）
     * @param updateError 更新失败错误码
     */
    private void handleStatisticsUpdate(Integer workId, StatisticsUpdateFunction updateFunc,
                                        ArtErrorCodeEnum updateError) {
        try {
            int affectedRows = updateFunc.apply(workId);
            if (affectedRows == 0) {
                // 二次查询确认记录是否存在（若高并发下记录可能被删除）
                ArtStatistics stats = artStatisticsMapper.getByWorkId(workId);
                if (stats == null) {
                    throw new BusinessException(ArtErrorCodeEnum.USER_MalicIOUS_BEHAVIOR);
                } else {
                    throw new BusinessException(updateError);
                }
            }
        } catch (DataAccessException e) {
            // 明确数据库异常
            throw new BusinessException(ArtErrorCodeEnum.DATABASE_ERROR);
        }
    }

    /**
     * 发送消息，更新ES中艺术作品的统计信息
     */
//    public void updateArtStatisticsToES(Integer workId) {
//        amqpMsgProducer.sendArtworkChangeMsg(new ArtWorkESReqDto(workId,false));
//    }

    /**
     * 作品的点击量加+1，如果表中也存在，则在原来的点击量上+1，防止新增一条数据关于该作品的添加数据，点击量设置为1，其他的默认
     * 使用 INSERT ... ON DUPLICATE KEY UPDATE 语句
     * 更新插入：一种数据库操作，如果记录已存在，则更新记录；如果记录不存在，则插入新记录。
     */
    @Override
    public void incrementClickCount(Integer workId) {
        try {
            // 使用 upsert 自动创建或更新
            artStatisticsMapper.upsertViewCount(workId);
        } catch (DuplicateKeyException e) {
            // 唯一键冲突
            throw new BusinessException(ArtErrorCodeEnum.UNIQUE_KEY_CONFLICT_ERROR);
        } catch (DataAccessException e) {
            // 点击量更新失败
            throw new BusinessException(ArtErrorCodeEnum.CLICK_COUNT_UPDATE_ERROR);
        }


        /*try {
            artStatisticsMapper.upsertViewCount(workId);
        } catch (Exception e) {
            throw new BusinessException(ArtErrorCodeEnum.CLICK_COUNT_UPDATE_ERROR);
        }*/

        /*ArtStatistics artStatistics = artStatisticsMapper.getByWorkId(workId);
        if (artStatistics == null) {
            //如果该作品还未存在统计信息，则除了点击量为1、下载量、分享量、喜欢量都为0
            artStatisticsMapper.insert(ArtStatistics.builder()
                    //作品id
                    .workId(workId)
                    .viewCount(CommonConsts.STATISTICS_COUNT_INIT + 1)
                    .build());
        }else{
            //如果该作品存在统计信息，则点击量加+1
            artStatisticsMapper.incrementViewCountByWorkId(workId);
        }*/

        // 发送消息，更新ES中艺术作品的统计信息
//        this.updateArtStatisticsToES(workId);
    }

    /**
     * 作品的下载量加+1，在原来的点击量上+1，如果表中数据不存在，则该行为是用户的恶意行为
     */
    @Override
    public void incrementDownloadCount(Integer workId) {
        handleStatisticsUpdate(
                workId,
                artStatisticsMapper::incrementDownloadCountByWorkId,
                ArtErrorCodeEnum.DOWNLOAD_COUNT_UPDATE_ERROR
        );

        /*int affectedRows = artStatisticsMapper.incrementDownloadCountByWorkId(workId);
        if (affectedRows == 0) {
            // 若更新失败，再查询一次确认记录是否存在（避免误判）
            ArtStatistics artStatistics = artStatisticsMapper.getByWorkId(workId);
            if (artStatistics == null) {
                throw new BusinessException(ArtErrorCodeEnum.USER_MalicIOUS_BEHAVIOR);
            } else {
                // 此处可能是并发删除导致，根据业务需求处理
                throw new BusinessException(ArtErrorCodeEnum.DOWNLOAD_COUNT_UPDATE_ERROR);
            }
        }*/

        /*ArtStatistics artStatistics = artStatisticsMapper.getByWorkId(workId);
        if (artStatistics == null) {
            //行为是用户的恶意行为
            throw new BusinessException(ArtErrorCodeEnum.USER_MalicIOUS_BEHAVIOR);
        }else{
            //如果该作品存在统计信息，则下载量加+1
            artStatisticsMapper.incrementDownloadCountByWorkId(workId);
        }*/

        // 发送消息，更新ES中艺术作品的统计信息
//        this.updateArtStatisticsToES(workId);
    }

    /**
     * 作品的分享量加+1，在原来的分享量上+1，如果表中数据不存在，则该行为是用户的恶意行为
     * 无法保证用户是否成功分享，存在一定的误差
     */
    @Override
    public void incrementShareCount(Integer workId) {
        handleStatisticsUpdate(
                workId,
                artStatisticsMapper::incrementShareCountByWorkId,
                ArtErrorCodeEnum.SHARE_COUNT_UPDATE_ERROR
        );

        /*int affectedRows = artStatisticsMapper.incrementShareCountByWorkId(workId);
        if (affectedRows == 0) {
            // 若更新失败，再查询一次确认记录是否存在（避免误判）
            ArtStatistics artStatistics = artStatisticsMapper.getByWorkId(workId);
            if (artStatistics == null) {
                throw new BusinessException(ArtErrorCodeEnum.USER_MalicIOUS_BEHAVIOR);
            } else {
                // 此处可能是并发删除导致，根据业务需求处理
                throw new BusinessException(ArtErrorCodeEnum.SHARE_COUNT_UPDATE_ERROR);
            }
        }*/

        /*ArtStatistics artStatistics = artStatisticsMapper.getByWorkId(workId);
        if (artStatistics == null) {
            //行为是用户的恶意行为
            throw new BusinessException(ArtErrorCodeEnum.USER_MalicIOUS_BEHAVIOR);
        } else {
            //如果该作品存在统计信息，则分享量加+1
            artStatisticsMapper.incrementShareCountByWorkId(workId);
        }*/

        // 发送消息，更新ES中艺术作品的统计信息
//        this.updateArtStatisticsToES(workId);
    }

    /**
     * 作品的喜欢量加+1，在原来的喜欢量上+1，如果表中数据不存在，则该行为是用户的恶意行为
     */
    @Override
    public void incrementLikeCount(Integer workId) {
        handleStatisticsUpdate(
                workId,
                artStatisticsMapper::incrementLikeCountByWorkId,
                ArtErrorCodeEnum.LIKE_COUNT_UPDATE_ERROR
        );

        /*int affectedRows = artStatisticsMapper.incrementLikeCountByWorkId(workId);
        if (affectedRows == 0) {
            // 若更新失败，再查询一次确认记录是否存在（避免误判）
            ArtStatistics artStatistics = artStatisticsMapper.getByWorkId(workId);
            if (artStatistics == null) {
                throw new BusinessException(ArtErrorCodeEnum.USER_MalicIOUS_BEHAVIOR);
            } else {
                // 此处可能是并发删除导致，根据业务需求处理
                throw new BusinessException(ArtErrorCodeEnum.LIKE_COUNT_UPDATE_ERROR);
            }
        }*/

        /*ArtStatistics artStatistics = artStatisticsMapper.getByWorkId(workId);
        if (artStatistics == null) {
            //行为是用户的恶意行为
            throw new BusinessException(ArtErrorCodeEnum.USER_MalicIOUS_BEHAVIOR);
        } else {
            //如果该作品存在统计信息，则喜欢量加+1
            artStatisticsMapper.incrementLikeCountByWorkId(workId);
        }*/

        // 发送消息，更新ES中艺术作品的统计信息
//        this.updateArtStatisticsToES(workId);
    }

    /**
     * 作品的喜欢量-1，在原来的喜欢量上-1，如果表中数据不存在，或者数据为0，则该行为是用户的恶意行为
     */
    @Override
    public void decrementLikeCount(Integer workId) {
        handleStatisticsUpdate(
                workId,
                artStatisticsMapper::decrementLikeCountByWorkId,
                ArtErrorCodeEnum.LIKE_COUNT_UPDATE_ERROR
        );

        /*int affectedRows = artStatisticsMapper.decrementLikeCountByWorkId(workId);
        if (affectedRows == 0) {
            // 若更新失败，再查询一次确认记录是否存在（避免误判）
            ArtStatistics artStatistics = artStatisticsMapper.getByWorkId(workId);
            if (artStatistics == null) {
                throw new BusinessException(ArtErrorCodeEnum.USER_MalicIOUS_BEHAVIOR);
            } else {
                // 此处可能是并发删除导致，根据业务需求处理
                throw new BusinessException(ArtErrorCodeEnum.LIKE_COUNT_UPDATE_ERROR);
            }
        }*/

        /*ArtStatistics artStatistics = artStatisticsMapper.getByWorkId(workId);
        if (artStatistics == null) {
            //行为是用户的恶意行为
            throw new BusinessException(ArtErrorCodeEnum.USER_MalicIOUS_BEHAVIOR);
        } else {
            //如果该作品存在统计信息，则喜欢量加-1
            artStatisticsMapper.decrementLikeCountByWorkId(workId);
        }*/

        // 发送消息，更新ES中艺术作品的统计信息
//        this.updateArtStatisticsToES(workId);
    }
}
